from PyQt6.QtWebSockets import QWebSocket
import json

class WebSocketClient(QWebSocket):
    """
    客户端类，继承自 QWebSocket。
    1，设置用户名，连接到指定的 WebSocket 服务端，收发消息。
    2，断开与服务端的连接。
    新增一个信号，用于表示登录成功，可以开始正常操作了
    """
    from PyQt6.QtCore import pyqtSignal
    login_successful = pyqtSignal()
    message_received = pyqtSignal(dict)  # 当收到并解析好一条消息后，发射此信号，附带解析后的消息内容（dict）

    def __init__(self):
        super().__init__()
        self.connected.connect(self.on_connected)  # 绑定连接服务端的信号。
        self.disconnected.connect(self.on_disconnected)  # 绑定断开连接的信号。
        self.textMessageReceived.connect(self.on_text_message_received)  # 绑定接收信息的信号。
        self._is_logged_in = False # 是否已登录的标志。

    def set_username_and_ip(self, username: str, ip: str="127.0.0.1"):
        """
        连接服务端，设置客户端用户名和服务端ip。
        :param username: 客户端用户名。
        :param ip: 服务端ip地址。
        """
        # 设置要连接的 WebSocket 服务端地址（默认本机 127.0.0.1:12345）。
        from PyQt6.QtCore import QUrl
        from server import port
        # from PyQt6.QtNetwork import QAbstractSocket
        # if self.state() == QAbstractSocket.SocketState.ConnectedState:
        self.close()  # 如果已经连接，可以选择先断开（可选，视需求而定）。
        self.url = QUrl(f"ws://{ip}:{port}")
        self.username = username  # 保存用户名。
        self.open(self.url)  # 主动发起连接。

    def on_connected(self):
        """
        当成功连接到服务端时调用。并发送含有用户名的字符串给服务端。
        """
        print("✅ 已连接到 WebSocket 服务端")
        # 构造并发送 JSON 格式的登录消息。
        login_data = {
            "type": "login",
            "username": self.username
        }
        json_str = json.dumps(login_data)  # 转为 JSON 字符串。
        self.send_message(json_str)  # 发送给服务端。

    def on_disconnected(self):
        """
        当与服务端断开连接时调用。
        """
        print("❌ 与 WebSocket 服务端断开连接")
        self._is_logged_in = False
        self.username = ''  # 取消客户端的用户名。

    def on_text_message_received(self, json_message: str):
        """
        当从服务端接收到文本消息时调用，终端显示来自服务端的消息。
        添加功能：释放接收的信号，同时把接收消息作为参数，以便自动处理。
        :param json_message: json格式的消息。
        """
        message = json.loads(json_message)
        if message["type"] == "tip":
            print(f"ℹ️ 来自服务端的消息：{message["context"]}")
            if "用户" in message["context"] and "连接成功" in message["context"]:
                self._is_logged_in = True
                self.login_successful.emit()  # 发射登录成功信号，通知外部登录成功了。
        else:
            print(f"💬 来自用户 {message["from_username"]} 的消息：{message["context"]}")
        # 🎯 关键改动：将解析后的消息，通过信号发送出去，而不是直接处理
        self.message_received.emit(message) # 发射信号，附带完整消息内容

    def send_message(self, json_message: str):
        """
        向服务端发送一条json格式的消息。
        :param message: json格式的消息。
        """
        self.sendTextMessage(json_message)

if __name__ == '__main__':
    import sys
    from PyQt6.QtWidgets import QApplication
    from tool_client import ChatWindow
    app = QApplication(sys.argv)
    window = ChatWindow()
    window.show()
    sys.exit(app.exec())